RDLC .Net 4 Local Mode Performans Sorunu
12 Aug 2017Sıkıntıya sebep olan kısmı açıklayacak olursak; bir rapor, .net 4 ile ReporViewer mevcut AppDomain yerine Sandbox AppDomain yapısı içerisinde işletilmektedir. Bu yenilik ile birlikte “Expression Evaluation” ifadeleri “Local Mode” mod ile çalıştırıldığında performans sorunu ortaya çıkmaktadır. Bu soruna çözüm olarak
-
Web.config
<system.web>tag içerisine<trust legacyCasModel="true" level="Full"/>ifadesini eklemek suretiyle CAS Security yapısı sınırsız izin hakkı ile aktif hale getirilir. Bu değişik şöyle bir sıkıntıya sebep olabilir uygulama üzerinde“dynamic”tanımlanmış bir değişken var ise uygulama runtime da hata verir. -
Uygulama
.net 3.5downgrade edilir. Bu yönetimi uyguladığınızda.net 4ile gelen yenilikleri kullanma imkanınız ortadan kalkar. -
Raporlarınız yeni oluşturacağınız AppDomain içerisinde üretilir.
a. Mevcut App Domain ayarları alınır
AppDomainSetup currentSetup = AppDomain.CurrentDomain.SetupInformation;
AppDomainSetup ads = new AppDomainSetup
{
ApplicationBase = currentSetup.ApplicationBase,
LoaderOptimization = LoaderOptimization.MultiDomainHost,
PrivateBinPath = currentSetup.PrivateBinPath,
PrivateBinPathProbe = currentSetup.PrivateBinPathProbe,
};b. CAS security yapısı aktif edilir.
ads.SetCompatibilitySwitches(new[] { "NetFx40_LegacySecurityPolicy" });c. Yeni AppDomain oluşturulur
AppDomain appDomain = AppDomain.CreateDomain("Full Trust", null,FullTrustedAppDomainSetup);d. Yeni AppDomain de raporun üretileceği MarshalByRefObject nesnesi üretilir.
ReportHelperInAppDomain repHelper = (ReportHelperInAppDomain) appDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);e. Üretilen AppDomain ve MarshalByRefObject nesnesinde rapor render edilir.
byte [] data = repHelper.RenderReport(reportName, reportDataSource.Name, dataTableToXmlStr, dataTable.TableName, dicParameters, format, deviceInfo);